package org.ithang.tools.dao;

import org.springframework.stereotype.Component;

import com.alibaba.fastjson2.JSON;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;

@Slf4j
@Component
public class BaseDao extends Dao {

	/**
	 * 查询一条数字列
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
    public Integer getsInt(String sql,Object ...params){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getJdbcTemplate().queryForObject(sql, Integer.class, params);
	}
    
    /**
	 * 查询一条数字列
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
    public Long getsLong(String sql,Object ...params){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
    	try {
		    return getJdbcTemplate().queryForObject(sql, Long.class, params);
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return 0L;
	}
    
    /**
	 * 查询一条数字列
	 * @param sql
	 * @param params map类型
	 * @return
	 */
	public Integer getInt(String sql,Map<String,Object> params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		try {
		    return getNamedJdbcTemplate().queryForObject(sql, params, Integer.class);
		}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return 0;
	}
    
    /**
	 * 查询多条数字列
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
    public List<Integer> listsInt(String sql,Object ...params){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
    	try {
    	    return getJdbcTemplate().queryForList(sql, Integer.class,params);
    	}catch(Exception e) {
    		log.error("查询出错：",e);
    		e.printStackTrace();
    	}
    	return null;
	}
    
    /**
	 * 查询多条数字列
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
    public List<Integer> listInt(String sql,Map<String,Object> params){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
    	try {
    	    return getNamedJdbcTemplate().queryForList(sql, params, Integer.class);
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return null;
	}
    
    /**
	 * 查询一条字符串列
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
    public String getsStr(String sql,Object ...params){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
    	try {
		    return getJdbcTemplate().queryForObject(sql, String.class,params);
    	}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return null;
	}
	
    /**
	 * 查询一条字符串列
	 * @param sql
	 * @param params map类型
	 * @return
	 */
	public String getStr(String sql,Map<String,Object> params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		try {
		    return getNamedJdbcTemplate().queryForObject(sql, params, String.class);
		}catch(Exception e) {
    		e.printStackTrace();
    	}
    	return null;
	}
	
   /**
	* 查询多条字符串列
	* @param sql
	* @param params 对象数组
	* @return
    */
	public List<String> listsStr(String sql,Object ...params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
	    return getJdbcTemplate().queryForList(sql, String.class,params);
	}
		
	/**
	 * 查询多条字符串列
	 * @param sql
	 * @param params map类型
	 * @return
	 */
	public List<String> listStr(String sql,Map<String,Object> params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getNamedJdbcTemplate().queryForList(sql, params, String.class);
	}
	
	/**
     * 查询一条任意类型列
     * @param sql
     * @param params map类型
     * @param cls
     * @return
     */
    public <T>T getObj(String sql,Map<String,Object> params,Class<T> cls){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getNamedJdbcTemplate().queryForObject(sql, params, cls);
	}
    
    /**
     * 查询一条任意类型列
     * @param sql
     * @param params map类型
     * @param cls
     * @return
     */
    public <T>List<T> listObj(String sql,Map<String,Object> params,Class<T> cls){
    	log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getNamedJdbcTemplate().queryForList(sql, params, cls);
	}
    
    /**
	 * 用传入的Map值 修改数据库
	 * @param sql
	 * @param params map类型
	 * @return
	 */
	public int updateSQL(String sql,Map<String,Object> params){
		try {
		    log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		    return getNamedJdbcTemplate().update(sql, params);	
		}catch(Exception e) {
			log.error("执行SQL出错!",e);
			log.error("出错SQL:{}",sql);
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * 简单修改，多参数值
	 * @param sql
	 * @param params 对象数组
	 * @return
	 */
	public int updatesSQL(String sql,Object ... params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		try {
		    return getJdbcTemplate().update(sql, params);
		}catch(Exception e) {
			log.error("执行SQL出错!",e);
			log.error("出错SQL:{}",sql);
			e.printStackTrace();
		}
		return 0;
	}
	
	/**
	 * 查询一条记录
	 * @param sql
	 * @param params map类型
	 * @return
	 */
	public Map<String,Object> getSQL(String sql,Map<String,Object> params){
		List<Map<String,Object>> rs=listMap(sql,params);
		if(null!=rs&&rs.size()>0){
			return rs.get(0);
		}
		return null;
	}
	
	public Map<String,Object> getsMap(String sql,Object... params){
		List<Map<String,Object>> rs=listsMap(sql,params);
		if(null!=rs&&rs.size()>0){
			return rs.get(0);
		}
		return null;
	}
	
	public <T>T getsBean(String sql,RowMapper<T> rowMapper,Object... params){
		List<T> rs=listsBean(sql,rowMapper,params);
		if(null!=rs&&rs.size()>0){
			return rs.get(0);
		}
		return null;
	}
	
	
	public List<Map<String,Object>> listMap(String sql,Map<String,Object> params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getNamedJdbcTemplate().queryForList(sql,params);
	}
	
	public List<Map<String,Object>> listsMap(String sql,Object... params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getJdbcTemplate().queryForList(sql,params);
	}
	
	
	public <T>List<T> listsBean(String sql,RowMapper<T> rowMapper,Object... params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getJdbcTemplate().query(sql, rowMapper,params);
	}
	
	public <T>List<T> listBean(String sql,RowMapper<T> rowMapper,Map<String,Object> params){
		log.info("SQL:{}\n\tParams:{}",sql,JSON.toJSONString(params));
		return getNamedJdbcTemplate().query(sql, params,rowMapper);
	}
	

}
